/**
 * 状态管理模块
 * 
 * 职责：
 * 1. 管理应用的全局状态
 * 2. 提供状态更新和查询接口
 * 3. 维护投注清单和选择状态
 * 4. 管理赔率历史记录
 * 
 * @module StateManager
 * @version 1.0.0
 * @since 2024-01-01
 */

/**
 * 全局状态对象
 * 包含应用运行时的所有状态数据
 * 
 * @typedef {Object} GlobalState
 * @property {string} currentLottery - 当前彩票类型 ('hk', 'macau', 'macau-new')
 * @property {string} currentGame - 当前游戏类型 ('tema', 'zhengma', 'lianma', etc.)
 * @property {string} currentSub - 当前子玩法类型
 * @property {Set<number>} selectedNumbers - 选中的号码集合
 * @property {Map} selectedSides - 选中的两面投注
 * @property {Set<string>} selectedAnimals - 选中的生肖集合
 * @property {Set<number>} selectedTails - 选中的尾数集合
 * @property {Set<number>} selectedHeads - 选中的头数集合
 * @property {Array<Object>} betList - 投注清单
 * @property {string} currentView - 当前视图 ('betting', 'banker')
 * @property {Object} statisticsData - 统计数据
 * @property {Object} oddsHistory - 赔率历史记录
 */
export const STATE = {
    currentLottery: 'hk',
    currentGame: 'tema',
    currentSub: 'zhixuan',
    selectedNumbers: new Set(),
    selectedSides: new Map(),
    selectedAnimals: new Set(), // 选中的生肖
    selectedTails: new Set(), // 选中的尾数
    selectedHeads: new Set(), // 选中的头数（特码头尾用）
    betList: [],
    currentView: 'betting',
    statisticsData: {
        today: { betCount: 0, betAmount: 0, winCount: 0, winAmount: 0 },
        history: [],
        hotNumbers: {},
        preferences: { tema_zhixuan: 0, tema_liangmian: 0, zhengma_renxuan: 0 }
    },
    oddsHistory: {} // 赔率历史记录 {gameType: [odds1, odds2, ...], ...}
};

/**
 * 状态管理器
 * 提供状态操作的统一接口
 * 
 * @namespace StateManager
 */
export const StateManager = {
    /**
     * 获取当前完整状态对象
     * 
     * @returns {GlobalState} 当前状态对象
     * @example
     * const currentState = StateManager.getState();
     * console.log(currentState.currentGame); // 'tema'
     */
    getState() {
        return STATE;
    },

    /**
     * 设置当前彩票类型
     * 
     * @param {string} lottery - 彩票类型 ('hk', 'macau', 'macau-new')
     * @example
     * StateManager.setCurrentLottery('hk');
     */
    setCurrentLottery(lottery) {
        STATE.currentLottery = lottery;
    },

    /**
     * 设置当前游戏类型
     * 
     * @param {string} game - 游戏类型 ('tema', 'zhengma', 'lianma', etc.)
     * @example
     * StateManager.setCurrentGame('tema');
     */
    setCurrentGame(game) {
        STATE.currentGame = game;
    },

    /**
     * 设置当前子玩法类型
     * 
     * @param {string} sub - 子玩法类型
     * @example
     * StateManager.setCurrentSub('zhixuan');
     */
    setCurrentSub(sub) {
        STATE.currentSub = sub;
    },

    // 添加选中号码
    addSelectedNumber(number) {
        STATE.selectedNumbers.add(number);
    },

    // 移除选中号码
    removeSelectedNumber(number) {
        STATE.selectedNumbers.delete(number);
    },

    // 清空选中号码
    clearSelectedNumbers() {
        STATE.selectedNumbers.clear();
    },

    // 添加选中生肖
    addSelectedAnimal(animalId) {
        STATE.selectedAnimals.add(animalId);
    },

    // 移除选中生肖
    removeSelectedAnimal(animalId) {
        STATE.selectedAnimals.delete(animalId);
    },

    // 清空选中生肖
    clearSelectedAnimals() {
        STATE.selectedAnimals.clear();
    },

    // 添加选中尾数
    addSelectedTail(tail) {
        STATE.selectedTails.add(tail);
    },

    // 移除选中尾数
    removeSelectedTail(tail) {
        STATE.selectedTails.delete(tail);
    },

    // 清空选中尾数
    clearSelectedTails() {
        STATE.selectedTails.clear();
    },

    // 添加选中头数
    addSelectedHead(head) {
        STATE.selectedHeads.add(head);
    },

    // 移除选中头数
    removeSelectedHead(head) {
        STATE.selectedHeads.delete(head);
    },

    // 清空选中头数
    clearSelectedHeads() {
        STATE.selectedHeads.clear();
    },

    // 添加投注项目
    addBetItem(betItem) {
        STATE.betList.push(betItem);
    },

    // 移除投注项目
    removeBetItem(betId) {
            // 移除投注项目
        
        const originalLength = STATE.betList.length;
        STATE.betList = STATE.betList.filter(bet => {
            // 直接使用字符串比较，避免数字精度问题
            const betIdStr = String(bet.id);
            const targetIdStr = String(betId);
            return betIdStr !== targetIdStr;
        });
        
            // 投注项目移除完成
    },

    // 清空投注列表
    clearBetList() {
        STATE.betList = [];
    },

    // 更新投注项目
    updateBetItem(betId, updates) {
        const betIndex = STATE.betList.findIndex(bet => bet.id === betId);
        if (betIndex !== -1) {
            STATE.betList[betIndex] = { ...STATE.betList[betIndex], ...updates };
        }
    },

    // 切换视图
    setCurrentView(view) {
        STATE.currentView = view;
    },

    // 更新统计数据
    updateStatistics(data) {
        STATE.statisticsData = { ...STATE.statisticsData, ...data };
    },

    // 添加赔率历史
    addOddsHistory(gameTypeKey, odds) {
        if (!STATE.oddsHistory[gameTypeKey]) {
            STATE.oddsHistory[gameTypeKey] = [];
        }
        
        // 避免重复记录相同的赔率
        const existingOdds = STATE.oddsHistory[gameTypeKey].find(existingOdds => 
            Math.abs(existingOdds - odds) < 0.001
        );
        
        if (!existingOdds) {
            STATE.oddsHistory[gameTypeKey].unshift(odds);
            // 最多保留10个历史赔率
            if (STATE.oddsHistory[gameTypeKey].length > 10) {
                STATE.oddsHistory[gameTypeKey] = STATE.oddsHistory[gameTypeKey].slice(0, 10);
            }
        } else {
            // 如果已存在相似赔率，将其移到最前面
            const index = STATE.oddsHistory[gameTypeKey].indexOf(existingOdds);
            STATE.oddsHistory[gameTypeKey].splice(index, 1);
            STATE.oddsHistory[gameTypeKey].unshift(existingOdds);
        }
    },

    // 获取赔率历史
    getOddsHistory(gameTypeKey) {
        return STATE.oddsHistory[gameTypeKey] || [];
    },

    // 获取最近使用的赔率
    getLastUsedOdds(gameTypeKey) {
        const history = this.getOddsHistory(gameTypeKey);
        return history.length > 0 ? history[0] : null;
    },

    // 保存赔率到历史记录
    saveOddsToHistory(gameTypeKey, odds) {
        this.addOddsHistory(gameTypeKey, odds);
    }
}; 